package com.demo.algorithm.lock;

/**
 * <p>
 * </p>
 *
 * @author yanyg
 * @date 2024/3/9 11:31
 */
public class ObjectLock {
    private Integer value; // 成员属性
    private Object object; // 共享资源对象

    // 内置锁，在静态方法上，锁住的是当前类的Class对象
    public static synchronized void add() { // synchronized修饰实例方法
        System.out.println(Thread.currentThread().getName() + " 开始执行");
        System.out.println(Thread.currentThread().getName() + " 执行完毕");
    }

    // 隐式锁，在普通方法上，相当于 synchronized(this) ，锁住的是当前实例对象
    public synchronized void increment() { // synchronized修饰实例方法
        System.out.println(Thread.currentThread().getName() + " 开始执行");
        System.out.println(Thread.currentThread().getName() + " 执行完毕");
    }


    public Integer method1() {    //被synchronized 修饰
        System.out.println("Method 1 start");
        // 代码块，锁住的是当前实例对象
        // 显示锁
        synchronized (this) {
            value++;
        }
        // 代码块，锁住的是当前类的Class对象
        // 显示锁
        synchronized (ObjectLock.class) {
            value++;
        }
        // 代码块，锁住的是任意实例对象object
        // 显示锁
        synchronized (object) {
            value++;
        }
        System.out.println("Method 1 end");
        return value;
    }

    public Integer getValue() {
        return value;
    }

}